// 配置axios请求与响应的拦截封装
// axios请求拦截封装，将所有请求接口（除登陆外，给header配置token
//axios响应拦截封装：将所有返回接口进行状态码（除200外

//导入axios
import axios from 'axios'
//导入Pluse框架
import { ElMessage } from 'element-plus'
//导入router做强制跳转
import router from '../router'

//1.配置公共路由访问地址及超时设置，如果有其它公共配置，统一在此处设置
const $axios = axios.create({
    //公共域名
    baseURL:'http://localhost:9191',
    //超时设置（一分钟未反馈响应，则认为链接超时
    timeout:60000
})

//2.设置axios请求拦截器：对接口进行token配置
$axios.interceptors.request.use((config)=>{
    config.headers['Content-Type']='application/json;charset=utf-8';
    // 从本地缓存中提取登录后用户数据
    let user = JSON.parse(sessionStorage.getItem('user'))
    // 如果存储了用户数据，证明是登录合法进入，就必须能够提取token
    if(user){
        // 如果存储了用户数据，证明是登录合法进入，就必须能够提取token
        config.headers['token'] = user.token
    }
    // 完成config配置后返回
    return config;
},(error)=>{
    return Promise.reject(error)
})

//3.设置axios响应拦截器，对响应的结果状态码进行判断和输出
$axios.interceptors.response.use((response)=>{
    //提前响应的data数据 ===> apiPost里面的响应接口（code+msg+data)
    let res = response.data;

    //response.config.数据类型的判断：文件数据/字符串数据
    if(response.config.responseType === 'blob'){
        //直接输出给组件
        return res;
    }
    if(typeof res === 'string'){
        res = res ? JSON.parse(res) : res;
    }

    let user = JSON.parse(sessionStorage.getItem('user'))
    //swich状态码的判断
    switch(res.code){
        case 401:
        case 403:
            //token失效
        ElMessage.error(res.msg);
        
        if(user&&user.role==='admin'){
            router.push('/admin')
        }else{
            router.push('/home/login')
        }
        break;
        case 404:ElMessage.error('请求地址不存在，请重新发送');break;
        case 500:ElMessage.error('无法链接服务器，请稍后尝试');break;
    }
    // 将处理完的响应结果return
    return res
},(error)=>{
    console.log('报错：'+error);
    return Promise.reject(error)
})


//4.导出axios
export default $axios;